package 力扣_算法题综合.自己不会但觉得高频;

/**
 * @author zx
 * @create 2023-01-08 18:16
 */
public class 移除元素_27 {
    /**
     * @return 方法一：双指针
     *
     * 时间复杂度：O(n), 其中n为序列的长度。只需要遍历该序列至多两次。
     * 空间复杂度：O(1)。只需要常数的空间保存若干变量。
     */
    public int removeElement(int[] nums, int val) {
        int res = 0;
        for(int fast = 0;fast < nums.length;fast++){
            if(nums[fast] != val){
                nums[res] = nums[fast];
                res++;
            }
        }
        return res;
    }

    /**
     * @return 方法二：双指针优化
     *
     * 时间复杂度：O(n), 其中n为序列的长度。只需要遍历该序列至多一次。
     * 空间复杂度：O(1)。只需要常数的空间保存若干变量。
     */
    public int removeElement2(int[] nums, int val) {
        int left = 0,right = nums.length;
        while(left < right){
            if(nums[left] == val){
                nums[left] = nums[right - 1];
                right--;
            }else{
                left++;;
            }
        }
        return left;
    }
}
